﻿using System;
using System.Collections.Generic;
using AccesoDatos.IDAO;
using Entidades;
using log4net;
using NHibernate;

namespace AccesoDatos.DAO
{
    public class DaoHistorialEvento:IDaoHistorialEvento
    {
        /// <summary>
        /// Metodo que recibe un objeto tomado
        /// del formulario y lo inserta en la 
        /// bd
        /// </summary>

        protected static readonly ILog log = LogManager.GetLogger(typeof(DaoHistorialEvento));
        public void Insertar(HistorialEvento c)
        {
            
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            ITransaction transaccion = null;
            try
            {
                transaccion = sesion.BeginTransaction();
                sesion.Save(c);
                transaccion.Commit();
                sesion.Flush();
                log4net.Config.XmlConfigurator.Configure();

                log.Warn("Resultado agregado con exito");

            }
            catch (Exception e)
            {
                e.GetBaseException();
                if (transaccion != null)
                {
                    log4net.Config.XmlConfigurator.Configure();

                    log.Warn("Resultado no se pudo agregar con exito");
                    transaccion.Rollback();
                    throw;
                }
            }

        }

        public void Modificar(HistorialEvento c)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Recibe el id del evento que se desea eliminar
        /// y lo elimina de la bd
        /// </summary>
       
        public void EliminarPorId(int id)
        {
            try
            {
               
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Entra en el método EliminarPorId recibiendo id: " + id);
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            sesion.Delete((HistorialEvento) sesion.Get(typeof (HistorialEvento), id));
            sesion.Transaction.Commit();
            log4net.Config.XmlConfigurator.Configure();
            log.Warn("Resultado se elimino con exito");
            }
            catch(NHibernate.ADOException adoException)
            {
                    log.Error("Error al eliminar Categoria");
                    log.Error(adoException.Message);
            }

        }

        public IList<HistorialEvento> SeleccionarTodos()
        {
            try
            {

                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionarTodos");
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from HistorialEvento");
                IList<HistorialEvento> retorna = (IList<HistorialEvento>)query.List<HistorialEvento>();
                sesion.Transaction.Commit();
                log.Info("Lista de eventos retornada");
                return retorna;
  
            }
            catch (ADOException exception)
            {

                log.Error("se ha producido un error en la seleccion de categorias");
                log.Error(exception.Message);
            }
            return null;
        }

        public HistorialEvento SeleccionarPorId(int id)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionarPorId recibiendo el id: " + id);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                HistorialEvento busqueda = (HistorialEvento)sesion.Get(typeof(HistorialEvento), id);
                sesion.Transaction.Commit();
                log.Info("Maquina retornada con éxito");
                return busqueda;
            }
            catch (ADOException exception)
            {
                log.Error("Error al retornar la maquina bajo el id: " + id);
                log.Error(exception.Message);
                throw new Exception();
            }
        }

        public IList<HistorialEvento> BuscarHistorialActual(int idEvento, int idParticipante)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                //log.Info("Entra en el metodo SeleccionarPorParametro recibiendo: parametro: " + parametro + " valor:" + valor);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from HistorialEvento where fkevento= " + idEvento + " and fkparticipante= " + idParticipante);
                IList<HistorialEvento> retorna = (IList<HistorialEvento>)query.List<HistorialEvento>();
                sesion.Transaction.Commit();
                log.Info("Se retorno la lista de categorias que cumplen con el parametro");
                return retorna;

            }
            catch (Exception exception)
            {
                log.Error("Error al seleccionar Categoria por parametro");
                log.Error(exception.Message);
                throw exception;
            }
            
        }
    }
}
